.PHONY:clean

# https://www.cnblogs.com/paul-617/p/15501875.html

CC = gcc
RM = rm
EXE = cDemo

#wildcard 是通配符函数，通过它可以得到我们所需的⽂件，这个函数类似我们在 Windows 或Linux 命令⾏中的“*”。其形式是：$(wildcard pattern)
SRCS=$(wildcard *.c)

#patsubst 函数是⽤来进⾏字符串替换的，其形式是：$(patsubst pattern, replacement, text)
#OBJS = $(patsubst %.c, %.o, $(SRC))

OBJS=$(SRCS:.c=.o)

all:$(EXE)
# 当没有指明具体的⽬标是什么 时，那么 make 以 Makefile ⽂件中定义的第⼀个⽬标作为这次运⾏的⽬标
# 在命令前加上一个@，这个符号就是告诉make，在运行的时候这一行命令不显示出来。
	@echo "targt all"
#$@⽤于表示⼀个规则中的⽬标。当我们的⼀个规则中有多个⽬标时，$@所指的是其中任何造成命令被运⾏的⽬标。
#$^则表示的是规则中的所有先择条件。
#$<表示的是规则中的第⼀个先决条件。
	@echo "\$$@ = $@"
	@echo "\$$^ = $^"
	@echo "\$$< = $<"
	@echo "$(SRCS)"
	@echo "$(OBJS)"

$(EXE):$(OBJS)
	$(CC) -o $@ $^

%.o: %.c %.h
# 采⽤了模式以后，不论有多少个源⽂件要编译，我们都是应⽤同⼀个模式规则的
# filter 函数⽤于从⼀个字符串中，根据模式得到满⾜模式的字符串，其形式是：$(filter pattern..., text)
# @echo "\$$@ = $@"
# @echo "\$$^ = $^"
# @echo "\$$< = $<"
	$(CC) -g -o $@ -c $(filter %.c, $^)

clean:
	rm $(EXE) $(OBJS)